package data

import (
	"context"
	"medicine/internal/biz"
)

// brandRepo 品牌仓储实现，负责品牌相关数据库操作
// 实现了 BrandRepo 接口
type brandRepo struct {
	data *DataRepo // 数据层依赖，包含数据库和缓存
}

func NewBrandRepo(data *DataRepo) biz.BrandRepo {
	return &brandRepo{data: data}
}

// Create 创建品牌
func (r *brandRepo) Create(ctx context.Context, b *biz.Brand) (*biz.Brand, error) {
	if err := r.data.DB.WithContext(ctx).Create(b).Error; err != nil {
		return nil, err
	}
	return b, nil
}

// Update 更新品牌
func (r *brandRepo) Update(ctx context.Context, b *biz.Brand) (*biz.Brand, error) {
	if err := r.data.DB.WithContext(ctx).Save(b).Error; err != nil {
		return nil, err
	}
	return b, nil
}

// Get 查询品牌详情
func (r *brandRepo) Get(ctx context.Context, id int64) (*biz.Brand, error) {
	var b biz.Brand
	if err := r.data.DB.WithContext(ctx).First(&b, id).Error; err != nil {
		return nil, err
	}
	return &b, nil
}

// List 分页查询品牌列表
func (r *brandRepo) List(ctx context.Context, page, pageSize int) ([]*biz.Brand, int, error) {
	var bs []*biz.Brand
	var total int64
	db := r.data.DB.WithContext(ctx)
	db.Model(&biz.Brand{}).Count(&total)
	db = db.Offset((page - 1) * pageSize).Limit(pageSize)
	if err := db.Find(&bs).Error; err != nil {
		return nil, 0, err
	}
	return bs, int(total), nil
}

// Delete 删除品牌
func (r *brandRepo) Delete(ctx context.Context, id int64) error {
	return r.data.DB.WithContext(ctx).Delete(&biz.Brand{}, id).Error
}

// NameExists 校验品牌名唯一性
func (r *brandRepo) NameExists(ctx context.Context, name string) bool {
	var count int64
	r.data.DB.WithContext(ctx).Model(&biz.Brand{}).Where("name = ?", name).Count(&count)
	return count > 0
}

// HasProduct 校验品牌是否被商品引用
func (r *brandRepo) HasProduct(ctx context.Context, brandId int64) bool {
	var count int64
	r.data.DB.WithContext(ctx).Model(&biz.Product{}).Where("brand_id = ?", brandId).Count(&count)
	return count > 0
}
